package com.cskaoyan.javase.exception._3myexception;

/**
 * @description: 自定义异常
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 1.如何自定义异常?
 *      手写一个类,让它继承:
 *          a.RuntimeException,定义了一个运行时异常
 *          b.Exception,定义了一个编译时异常
 *      手写完继承后,只需要提供两个构造方法,就完成自定义异常:
 *          a.无参,直接调用父类无参
 *          b.String单参,直接调用父类String单参
 *
 * 2.自定义异常有何意义?怎么使用?
 *      异常类和对象,仅仅是封装了异常相关的信息,如何抛出在哪里抛出,如何处理在哪里处理,和异常对象无关
 *
 * > 为什么需要自定义异常？
 * - 通过已有异常类的构造方法添加message也可以实现输出不同的信息
 *   - 那么为什么还要去实现我们自己的自定义异常呢？
 * - 因为用已有异常添加message的方法虽然在抛出时，和自定义异常是一样的。
 *   - 但是无法单独catch，单独处理。
 *   - 自定义了一个自定义异常后，可以在自己需要的地方抛出，然后精确的去捕获，去处理
 *
 *
 * 公司中都有自己的异常体系,针对自身业务
 *
 */
public class Demo {
    public static void main(String[] args) {
        try {
            judgeObjectNumException(1);
        } catch (MyException e) {
            e.printStackTrace();
        }
    }

    //抛出编译时异常
    public static void judgeObjectNumException(int num) throws MyException {
        if (num > 1) throw new MyException("海王");
        if (num < 0) throw new MyException("鱼塘");
    }

    //抛出运行时异常
    public static void judgeObjectNumRuntime(int num) {
        if (num > 1) throw new MyRuntimeException("海王");
        if (num < 0) throw new MyRuntimeException("鱼塘");
    }
}

class MyRuntimeException extends RuntimeException {
    public MyRuntimeException() {
    }

    public MyRuntimeException(String message) {
        super(message);
    }
}

class MyException extends Exception {
    public MyException() {
    }

    public MyException(String message) {
        super(message);
    }
}
